export {}//接口不能有具体的实现，可以用于描述函数、混合类型、对象、类
//------------------type和interface却别--------------------------
// interface IFullname{
//     firstname:string,
//     lastname:string
// }
type IFullname={
    firstname:string,
    lastname:string
}
type IFn=(obj:IFullname)=>string
const fullname=({firstname,lastname}:IFullname):string=>{
    return firstname+lastname
}
const fullname1:IFn=({firstname,lastname})=>{
    return firstname+lastname
}

fullname({firstname:'zh',lastname:'hong'})

//type和interface的区别
//1.如果只是用来描述结构（比如对象），用interface
//2.如果涉及到联合类型，只能采用type
//3.type不能被扩展，interface可以扩展
//4.type不能重名，interface重名可以合并
//5.type在后续学习中可以使用循环和条件，interface不可以
//其他情况无所谓，都可以互换（函数一般采用type来申明）
interface Iclick{
    ():number,
    count:number
}
const click:Iclick=()=>{ //使用let申明，ts回提示有错误，因为可能会被后续修改，需要用const申明
return click.count++
}
click.count=0

//一般情况下，使用接口大概率是描述 对象了

//------------------interface的修饰符--------------------------
interface Ivg1{
    //接口中申明的都是抽象的，而且必须实现
    readonly color:string, //只读属性
    size:number,
    tast?:string //可选属性
}
const tomato0:Ivg1={
    color:'pink' ,
    size:20,
    // tast:'solt' //可选属性，可以无
}
//tomato.color='red'//只读属性不能修改

//------------------interface已经定义的接口，怎么可以再创建定义以外的属性--------------------------
interface Ivg{
  color:string, //只读属性
    size:number,
    tast:string //可选属性
}
//1、如果对象中的属性，多于接口可以直接采用断言的方式来赋值
const tomato1:Ivg={
    color:'yellow',
    size:1,
    tast:'solt',
    a:1
} as Ivg;
//2、可以基于接口的特征，写一个同名接口
// interface Ivg{
//     a:number
// }
//  const tomato2:Ivg={
//     color:'yellow',
//     size:1,
//     tast:'solt',
//     a:1
// }
//3、产生新类型，通过继承原有属性的方式
interface Iv extends Ivg{
    a:number
}
const tomato3:Iv={
    color:'yellow',
    size:1,
    tast:'solt',
    a:1
}
//4、通过任意类型来扩展
interface Ivg11{
    color:string, //只读属性
      size:number,
      tast:string //可选属性
      [hey:string]:any //通过任意类型来扩展，可以添加人意属性
  }
  const ss5={
    color:'yellow',
    size:1,
    tast:'solt',
    a:1,
    b:4
  }

//5、类型兼容，（先创建一个对象，再把对象赋给另外一个节藕定义为Ivg的对象），这样ts无法检测到
const ss={
    color:'yellow',
    size:1,
    tast:'solt',
    a:1
}
const tomato4:Iv=ss;
//6、&交叉类型（后续讲）
// --------------接口访问符----------------------
interface Person{
    name:'string'
    age:number
}
//通过索引访问符号，可以获取值的类型
type PersonNameType=Person['name']
type PersonAgeType=Person['age']
//通过索引操作符获取值的集合
type valueOf=Person[keyof Person]

// --------------可以被类实现多个接口，描述类中的原型方法和实例属性----------------------
interface SpeckChinese{
    speckChinese():void

}
interface SpeakEnglish{
    speakEnglish():void
}
class Speck implements SpeckChinese,SpeakEnglish{
    speakEnglish(): void {
        throw new Error("Method not implemented.")
    }
    speckChinese(): void {
        throw new Error("Method not implemented.")
    }

}
export {}